package com.maoyu.cloud.api.Controller;

import com.alibaba.fastjson.JSONObject;
import com.maoyu.cloud.api.common.Response;
import com.maoyu.cloud.api.service.ApiService;
import com.maoyu.cloud.mybatis.entity.PtUserEntity;
import com.zhenzi.sms.ZhenziSmsClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;

@RestController
@RequestMapping("/api")
@Slf4j
public class SendCodeController {

    @Resource
    private ApiService apiService;
    //短信平台相关参数
    //这个不用改
    private String apiUrl = "https://sms_developer.zhenzikj.com";
    //榛子云系统上获取
    private String appId = "112834";
    private String appSecret = "e07e9f2e-5e56-426c-86b9-bbd79c2c1916";

    /**
     * 发送验证码
     * @param phone 手机号
     * @param  request
     * @return 返回验证码
     */
    @RequestMapping("/sendCode")
    public Response sendCode(@RequestParam("phone") String phone, HttpServletRequest request){
        try {
            //短信发送需要的参数是json类型
            JSONObject json = null;
            //随机6位生成验证码
            String code =String.valueOf(ThreadLocalRandom.current().nextInt(100000, 1000000));
            //将验证码通过榛子云接口发送至手机
            ZhenziSmsClient client = new ZhenziSmsClient(apiUrl, appId, appSecret);
            //参数类型
            Map<String, Object> params = new HashMap<String, Object>();
            //前台输入的手机号
            params.put("number", phone);
            //这个模板id对应的是榛子云个人中心的模板id
            params.put("templateId", 11162);
            //参数占位符,不同的模板有不同的参数个数 目前用的模板有两个参数
            String[] templateParams = new String[2];
            //第一个参数 随机生成的六位验证码
            templateParams[0] = code;
            //第二个参数 x分钟
            templateParams[1] = "5";
            //把参数占位符放在整体参数中
            params.put("templateParams", templateParams);
            //执行发送短信
            String result = client.send(params);
            System.out.println(result);
            json = JSONObject.parseObject(result);
            //发送短信失败
            if (json.getIntValue("code")!=0){
                return  new Response(json.getIntValue("code"),json.getString("data"));
            }
            //将验证码存到session中,同时存入创建时间
            //以json存放，这里使用的是阿里的fastjson
            json = new JSONObject();
            json.put("memPhone",phone);
            json.put("code",code);
            json.put("createTime",System.currentTimeMillis());

            //将验证码存到session中
            //将认证码存入SESSION
            request.getSession().setAttribute("code",json);
            return new Response(result);
        } catch (Exception e) {
            e.printStackTrace();
            return new Response("发送失败");
        }
    }

    /**
     * 验证验证码
     * @param memPhone 手机号
     * @param code 验证码
     * @param HttpServletRequest request
     * @return
     */
    @RequestMapping("/checkCode")
    public Response checkCode(@RequestParam("phone") String memPhone, @RequestParam("code") String code, HttpServletRequest request){
        try {
            //从session中取出验证码
            JSONObject json = (JSONObject) request.getSession().getAttribute("code");
            log.info("json:{}",json);
            //判断验证码是否过期
            if (json==null||System.currentTimeMillis()-json.getLongValue("createTime")>1000*60*5){
                return new Response("验证码已过期");
            }
            //判断手机号是否正确
            if (!json.getString("memPhone").equals(memPhone)){
                return new Response("手机号错误");
            }
            //判断验证码是否正确
            if (!json.getString("code").equals(code)){
                return new Response("验证码错误");
            }
            return new Response("验证成功");
        } catch (Exception e) {
            e.printStackTrace();
            return new Response("验证失败");
        }
    }

    /**
     * 注册
     * @param ptUserEntity 用户信息
     */
    @RequestMapping("/register")
    public Response register(@RequestBody PtUserEntity ptUserEntity){
        int result = apiService.register(ptUserEntity);
        if (result>0) {
            return new Response("注册成功");
        }
        return new Response("注册失败");
    }
}
